CREATE OR ALTER PROCEDURE P_UDF_MATERIALOUT_YZ
    @DATE VARCHAR(20),    --单据入库日期，格式必须是YYYYMMDD
	@DEPT VARCHAR(20),    --部门代号
	@HANDLER VARCHAR(20), --经办人
	@MATERIAL VARCHAR(20),--物料
	@QTY NUMERIC(12, 4),  --出库数量
	@MOCODE VARCHAR(20),  --生产订单
	@WAREHOUSE VARCHAR(100),--仓库编号
	@XCC VARCHAR(20),     --现场仓编号
	--返回的信息，存储过程会通过出参返回错误信息或操作成功，另有返回值，返回值=0，则说明成功
	@MSG VARCHAR(500) OUTPUT  
AS
BEGIN
    DECLARE @PREFIX VARCHAR(100);
	DECLARE @CURRENT_ORDER VARCHAR(100);
	DECLARE @NEXT_ORDER VARCHAR(100);
	DECLARE @PRODUCT VARCHAR(100);
	DECLARE @AVALIABLE_QTY NUMERIC(12, 4);
	DECLARE @SEQ VARCHAR(100)
	DECLARE @PRODUCTNAME VARCHAR(200)
	DECLARE @UNIT VARCHAR(50)
	SET @PREFIX = 'MD'+@DATE;
	SELECT @CURRENT_ORDER = ISNULL(MAX(RBA002),@PREFIX+'000') FROM SGMRBA  WHERE RBA001 = '82' AND RBA002 LIKE @PREFIX+'%';
	SET @NEXT_ORDER = @PREFIX + RIGHT(1001+CONVERT(INT,RIGHT(@CURRENT_ORDER,5)),3);

	SELECT TOP 1 @PRODUCT=RAA015,@WAREHOUSE = DEA008,@AVALIABLE_QTY = RAB007-RAB008,@SEQ = RAB002,
		@PRODUCTNAME = DEA002,@UNIT = DEA003
		FROM SGMRAA 
		LEFT JOIN TPADEA ON RAA015 = DEA001 
		LEFT JOIN SGMRAB ON RAB001 = RAA001
		WHERE (RAA020<>'F') AND RAA018>RAA019  --未完工
		AND RAA024='T'                         --已审核
	    AND RAA001 NOT IN (SELECT RMA001 FROM SGMRMA WHERE RMA016 ='F') --不存在工艺变更
		AND NOT EXISTS(SELECT RAC001 FROM SGMRAC WHERE RAC001=RAA001)   --非工艺管理
		AND RAB003 = @MATERIAL
		AND RAB010 = 'N' --如果一个备料明细里面有多个相同的物料，则首先满足第一个物料，第一个物料审核完后，再满足第二个物料
		AND RAA001 = @MOCODE;

	IF @PRODUCT IS NULL
	BEGIN
		SET @MSG = '无法根据单号找到符合条件的生产订单，也有可能是生产订单未审核、已完工、正在工艺变更或已进行工艺管理';
		RETURN -1;
	END
	IF @AVALIABLE_QTY < @QTY
	BEGIN
	    SET @MSG = '不允许超额出库';
		RETURN -1;
	END

	BEGIN TRANSACTION;
	BEGIN TRY
	/* 单头 */
	INSERT INTO SGMRBA(
		RBA001,--类别，固定为82
		RBA002,--单号
		RBA004,--日期
		RBA005,--经办人
		RBA012,--审核码，填入F
		RBA014,--部门
		RBA022,--凭证抛转否 ，填入F
		RBA026,--套数，填入0
		RBA028,--打印次数，填入0
		RBA901,--录入人
		RBA902,--录入时间
		RBA905 --填入1
	)VALUES('82',@NEXT_ORDER,@DATE,@HANDLER,'F',@DEPT,'F',0,0,@HANDLER,GETDATE(),1);
	
	/* 单身 */
	INSERT INTO SGMRBB(
		RBB001,--类别
		RBB002,--单号
		RBB003,--序号，可恒为001
		RBB004,--子件品号  
		RBB005,--品名
		RBB006,--单位
		RBB007,--仓库，@WAREHOUSE 
		RBB008,--现场仓，@XCC
		RBB009,--数量
		RBB010,--工单单号
		RBB011,--明细行序号
		RBB013,--审核码，F
		RBB015,--可替代, F
		RBB021,--批号，********************
		RBB023,--来源单类型，恒81
		RBB901,
		RBB902,
		RBB905
		--RCC980~995为自定义
	)VALUES('82',@NEXT_ORDER,'001',@MATERIAL,@PRODUCTNAME,@UNIT,@WAREHOUSE,@XCC,@QTY,@MOCODE,@SEQ,'F','F','********************','81',@HANDLER,GETDATE(),1);

	
	/* 单身-工单 */
	INSERT INTO SGMRBD(
		RBD001,
		RBD002,
		RBD003,
		RBD004,--生产订单
		RBD006,--@XCC
		RBD008,--主件
		RBD009,
		RBD901,--录入者编号，填入@HANDLER
		RBD902,--录入时间，填入GETDATE()
		RBD905--更新标记，填入1
		) VALUES ('82',@NEXT_ORDER, '81',@MOCODE,@XCC,@PRODUCT,'F',@HANDLER,GETDATE(),1);

	COMMIT;
	SET @MSG = @NEXT_ORDER;
	RETURN 0;
	END TRY
	BEGIN CATCH
	ROLLBACK;
	SET @MSG = ERROR_MESSAGE();
	RETURN -3;
	END CATCH;


END;